class Solution {
    /**
     * 思路：剪枝
     * 首先很容易知道 可以用两个for循环 枚举所有起点终点 解决问题 但是时间复杂度为O(N*N)
     * 而采用双指针移动法 每次 p1 或 p2 的移动 都会减去O(N) 的遍历次数
     *
     * 案例: [1,8,6,2,5,4,8,3,7]
     *       p1              p2
     * 为什么移动p1而移动p2 因为p1为起点 其他任意位置为终点的ans 一定比当前的ans要小
     * 所有以p1为起点的位置不用去遍历了
     * 参考: https://leetcode-cn.com/problems/container-with-most-water/solution/on-shuang-zhi-zhen-jie-fa-li-jie-zheng-que-xing-tu/
     */
    public int maxArea(int[] height) {
        int p1 = 0, p2 = height.length - 1;
        int ans = 0;
        while (p1 < p2) {
            int tmpAns = (p2 - p1) * Math.min(height[p1], height[p2]);
            ans = Math.max(ans, tmpAns);

            if (height[p1] < height[p2])
                p1++;
            else
                p2--;
        }
        return ans;
    }
}